"""
思路：
1.准备两个进程
2.准备一个队列 一个向队列中写入数据， 然后 向另一个进程传递
3.另外一个进程读取数据
"""
from multiprocessing.pool import ApplyResult
import time
import multiprocessing

# 1.写入数据到队列的函数
def write_queue(queue):
    # for 循环，向队列中写入数据
    for i in range(10):
        # 判断队列是否已满
        if queue.full():
            print('队列已满')
            break
        # 向队列中放入值
        queue.put(i)
        print("写入成功，已经写入：",i)
        time.sleep(0.5)

# 2.读取队列数据并显示的的函数
def read_queue(queue):
    while True:
        # 判断队列是否已经为空
        if queue.qsize() == 0:
            print('队列已空')
            break

        # 从队列中读取数据
        value = queue.get()
        print("已经读取：",value)

# if __name__ == "__main__":
#     # 1.创建进程池
#     pool = multiprocessing.Pool(2)

#     # 2.创建进程池中的队列
#     queue = multiprocessing.Manager().Queue(5)
    
#     # 3.使用进程池执行任务
#     # 3.1 同步方式
#     pool.apply(write_queue,(queue,))
#     pool.apply(read_queue,(queue,))


if __name__ == '__main__':
    # 1.创建进程池
    pool = multiprocessing.Pool(2)

    # 2.创建进程池中的队列
    queue = multiprocessing.Manager().Queue(5)

    # 3.使用进程池执行任务
    # 3.2 异步方式
    # apply_async() 返回值 ApplyResult对象 ,该对象由一个 wait() 的方法
    # wait() 方法类似join() 表示先让 当前进程 执行完毕,后续进程才能 启动

    # pool.apply_async(write_queue,(queue,))
    result = pool.apply_async(write_queue,(queue,))
    result.wait()
    
    pool.apply_async(read_queue,(queue,))

    pool.close() # close()表示不再接收新的任务
    pool.join()  # 主进程会等待进程池执行结束后再退出